﻿#include <learn/math/math.h>
#include <learn/painter/painter2d.h>
#include <learn/painter/win_ctx.h>

#include <complex>

using namespace xi::painter;
using namespace xi::math;

void init_proc(const Paint_Context *ctx);
void deal_proc(const Paint_Context *ctx);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    Win_Context window(hInstance, nCmdShow, 100, 100, 1000, 600, init_proc, deal_proc, L"My Demo");
    return window.message_loop();
}

void init_proc(const Paint_Context *ctx)
{
    // auto painter = ctx->painter();
    // painter->refresh();
    // auto width = painter->frame()->width;
    // auto height = painter->frame()->height;

    // // z = z^2 + c
    // int N = 2000;
    // double R = 1000000.0;
    // double thickness = 100;
    // for (int j = 0; j < height; j++)
    // {
    //     for (int i = 0; i < width; i++)
    //     {
    //         auto x = (double)i / width * 3.5 - 2.5;
    //         auto y = (double)j / height * 2.0 - 1.0;
    //         auto c = std::complex<double>{x, y};
    //         auto z = c;
    //         auto dPz = std::complex<double>{1.0, 0.0};
    //         auto dPc = std::complex<double>{1.0, 0.0};
    //         TGA_Color color;

    //         bool outside = false;
    //         for (int k = 0; k < N; k++)
    //         {
    //             // 内部，收敛到吸引循环
    //             if (std::abs(dPz) < 1e-3)
    //                 break;

    //             if (std::abs(z) > R)
    //             {
    //                 color.bgra[0] = 255;
    //                 color.bgra[1] = 255;
    //                 color.bgra[2] = 255;
    //                 outside = true;
    //                 break;
    //             }

    //             dPz = dPz * z * std::complex<double>{2.0, 0.0};
    //             dPc = dPc * z * std::complex<double>{2.0, 0.0} + std::complex<double>{1.0, 0.0};
    //             z = z * z + c;
    //         }

    //         if (outside)
    //         {
    //             auto r = std::pow(std::abs(z), 2);
    //             auto d = r * std::pow(log(r), 2) / std::abs(dPc);
    //             auto t = std::min(1.0, d / (thickness * width * height));

    //             color.bgra[0] = 255 * t;
    //             color.bgra[1] = 255 * t;
    //             color.bgra[2] = 255 * t;
    //         }

    //         painter->set_pixel(i, j, color);
    //     }
    // }
}

void init_proc1(const Paint_Context *ctx)
{
    // auto painter = ctx->painter();
    // painter->refresh();

    // // z = z^2 + c
    // int N = 2000;
    // double R = 1000000.0;
    // auto width = painter->frame()->width;
    // auto height = painter->frame()->height;
    // for (int j = 0; j < height; j++)
    // {
    //     for (int i = 0; i < width; i++)
    //     {
    //         auto x = (double)i / width * 3.5 - 2.5;
    //         auto y = (double)j / height * 2.0 - 1.0;
    //         auto c = std::complex<double>{x, y};
    //         auto z = std::complex<double>{0.0, 0.0};
    //         TGA_Color color;

    //         // |z| < 2 时，认为属于集合
    //         int count = 0;
    //         double pow = 1.0;
    //         while (count++ < N)
    //         {
    //             double z2 = std::pow(std::abs(z), 2);
    //             if (z2 > R)
    //             {
    //                 auto V = log(z2) / pow;
    //                 double K = log(2);
    //                 double a = 1 / log(2), b = a / (3 * std::pow(2, 1.0 / 2)), c = a / (7 * std::pow(3, 1.0 / 8));
    //                 color.bgra[0] = 255 * (1 - cos(2 * Numeric::pi * log(V) / K * a)) / 2;
    //                 color.bgra[1] = 255 * (1 - cos(2 * Numeric::pi * log(V) / K * b)) / 2;
    //                 color.bgra[2] = 255 * (1 - cos(2 * Numeric::pi * log(V) / K * c)) / 2;
    //                 break;
    //             }

    //             z = z * z + c;
    //             pow *= 2;
    //         }

    //         painter->set_pixel(i, j, color);
    //     }
    // }
}

void deal_proc(const Paint_Context *ctx)
{
    // return;
    // auto painter = ctx->painter();
    // auto t = double(painter->duration()) / 100;
    // double x0 = -1.35;
    // double y0 = -0.05;

    // // z = z^2 + c
    // int N = 2000;
    // double R = 2.0;
    // auto width = painter->frame()->width;
    // auto height = painter->frame()->height;
    // for (int j = 0; j < height; j++)
    // {
    //     for (int i = 0; i < width; i++)
    //     {
    //         auto x = (double)i / width * 3.5 - 2.5;
    //         auto y = (double)j / height * 2.0 - 1.0;
    //         x = (x - x0) / std::pow(t, 2) + x0;
    //         y = (y - y0) / std::pow(t, 2) + y0;
    //         auto c = std::complex<double>{x, y};
    //         auto z = c;
    //         auto der = std::complex<double>{1.0, 0.0};
    //         TGA_Color color;

    //         for (int k = 0; k < N; k++)
    //         {
    //             // 内部，收敛到吸引循环
    //             if (std::abs(der) < 1e-3)
    //                 break;

    //             if (std::abs(z) > R)
    //             {
    //                 color.bgra[0] = 255;
    //                 color.bgra[1] = 255;
    //                 color.bgra[2] = 255;
    //                 break;
    //             }

    //             der = der * z * std::complex<double>{2.0, 0.0};
    //             z = z * z + c;
    //         }

    //         painter->set_pixel(i, j, color);
    //     }
    // }
}
